সি প্রোগ্রামিং ভাষায় এরর হ্যান্ডলিং ফাংশন ব্যবহার করে প্রোগ্রাম চলাকালীন কোনো সমস্যা বা ত্রুটি (error) শনাক্ত করা এবং সেগুলো পরিচালনা করা যায়। এরর হ্যান্ডলিং ফাংশনগুলো প্রোগ্রামের স্থিতিশীলতা এবং ত্রুটিপূর্ণ অবস্থা থেকে পুনরুদ্ধারে সহায়ক। এই ফাংশনগুলো সাধারণত errno.h
এবং stdlib.h
হেডার ফাইলের অন্তর্গত।
নিচে সি প্রোগ্রামিংয়ের গুরুত্বপূর্ণ কিছু এরর হ্যান্ডলিং ফাংশন এবং ম্যাক্রো সম্পর্কে আলোচনা করা হলো।
perror()
– এররের বর্ণনা প্রদর্শনperror()
ফাংশনটি সর্বশেষ ঘটে যাওয়া ত্রুটির (error) জন্য একটি বার্তা প্রদর্শন করে। এটি সাধারণত errno
ভেরিয়েবলের মান অনুযায়ী এররের বর্ণনা দেখায়।
void perror(const char *message);
#include <stdio.h>
#include <errno.h>
int main() {
FILE *file = fopen("nonexistent.txt", "r");
if (file == NULL) {
perror("Error opening file");
}
return 0;
}
Output:Error opening file: No such file or directory
strerror()
– এররের স্ট্রিং বার্তা প্রদানstrerror()
ফাংশনটি errno
কোডের উপর ভিত্তি করে একটি স্ট্রিং বার্তা প্রদান করে। এটি errno
ভেরিয়েবলের মান অনুসারে এররের বর্ণনা রিটার্ন করে।
char *strerror(int errnum);
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main() {
FILE *file = fopen("nonexistent.txt", "r");
if (file == NULL) {
printf("Error: %s\n", strerror(errno));
}
return 0;
}
Output:Error: No such file or directory
errno
– এরর নম্বর ভেরিয়েবলerrno
একটি গ্লোবাল ইন্টিজার ভেরিয়েবল যা সর্বশেষ ঘটে যাওয়া ত্রুটির কোড সংরক্ষণ করে। যখন একটি ত্রুটি ঘটে, তখন errno
ভেরিয়েবলে নির্দিষ্ট একটি মান সংরক্ষিত হয়, যা errno.h
হেডার ফাইল থেকে ব্যবহার করা যায়।
#include <stdio.h>
#include <errno.h>
int main() {
FILE *file = fopen("nonexistent.txt", "r");
if (file == NULL) {
printf("Error code: %d\n", errno);
}
return 0;
}
Output:Error code: 2
(এই কোডটি নির্দিষ্ট এরর ম্যাসেজের প্রতিনিধিত্ব করে, যেমন "No such file or directory")
exit()
– প্রোগ্রাম থেকে বেরিয়ে যাওয়াexit()
ফাংশনটি প্রোগ্রাম থেকে নির্দিষ্ট স্ট্যাটাস কোড সহ বেরিয়ে যেতে ব্যবহৃত হয়। এটি একটি EXIT_SUCCESS
বা EXIT_FAILURE
কোড সহ প্রোগ্রাম থেকে বের হতে সাহায্য করে।
void exit(int status);
EXIT_SUCCESS
– সফলভাবে প্রোগ্রাম শেষ হয়েছে।EXIT_FAILURE
– প্রোগ্রাম ত্রুটিপূর্ণভাবে শেষ হয়েছে।#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
printf("File not found.\n");
exit(EXIT_FAILURE);
} else {
printf("File opened successfully.\n");
fclose(file);
}
exit(EXIT_SUCCESS);
}
setjmp()
এবং longjmp()
– এরর পুনরুদ্ধারের জন্য জাম্পিংsetjmp()
এবং longjmp()
ফাংশনগুলো প্রোগ্রামের এক অংশ থেকে অন্য অংশে লাফানোর জন্য ব্যবহৃত হয়। এগুলো সাধারণত এরর পুনরুদ্ধারের জন্য ব্যবহৃত হয়, যেখানে setjmp()
বর্তমান অবস্থান সংরক্ষণ করে এবং longjmp()
সংরক্ষিত অবস্থানে ফিরে আসে।
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);
#include <stdio.h>
#include <setjmp.h>
jmp_buf buffer;
void testFunction() {
printf("Inside testFunction\n");
longjmp(buffer, 1); // setjmp এর অবস্থানে ফিরে যায়
}
int main() {
if (setjmp(buffer)) {
printf("Back to main function\n");
} else {
printf("Calling testFunction\n");
testFunction();
}
return 0;
}
Output:
Calling testFunction
Inside testFunction
Back to main function
errno
কোডসমূহerrno কোড | বর্ণনা |
---|---|
EACCES | অনুমতি নেই |
EBADF | অবৈধ ফাইল ডেসক্রিপ্টর |
ENOMEM | মেমোরি বরাদ্দের জন্য পর্যাপ্ত স্থান নেই |
EFAULT | অবৈধ মেমোরি অ্যাক্সেস |
EINVAL | অবৈধ আর্গুমেন্ট |
EIO | ইনপুট/আউটপুট ত্রুটি |
ENOENT | ফাইল বা ডিরেক্টরি খুঁজে পাওয়া যায়নি |
EPERM | অপারেশন করার অনুমতি নেই |
ফাংশন | কাজ |
---|---|
perror() | সর্বশেষ ঘটে যাওয়া ত্রুটির বার্তা প্রদর্শন করে |
strerror() | নির্দিষ্ট errno কোডের স্ট্রিং বার্তা প্রদান করে |
errno | সর্বশেষ ঘটে যাওয়া ত্রুটির কোড সংরক্ষণ করে |
exit() | প্রোগ্রাম থেকে নির্দিষ্ট স্ট্যাটাস কোড সহ বেরিয়ে যায় |
setjmp() | বর্তমান অবস্থান সংরক্ষণ করে |
longjmp() | setjmp() দ্বারা সংরক্ষিত অবস্থানে ফিরে আসে |
সি প্রোগ্রামে এরর হ্যান্ডলিং ফাংশনগুলো ব্যবহারের মাধ্যমে ত্রুটি পরিচালনা করা সহজ হয় এবং প্রোগ্রামের স্থিতিশীলতা ও কার্যকারিতা বৃদ্ধি পায়। errno
, perror()
, strerror()
এবং exit()
এরর হ্যান্ডলিংয়ের জন্য গুরুত্বপূর্ণ ভূমিকা পালন করে।
errno.h
এর ধারণা এবং এর প্রয়োজনীয়তাerrno.h
হেডার ফাইলটি সি প্রোগ্রামিং ভাষায় ত্রুটি নির্দেশক (error handling) ব্যবস্থাপনার জন্য ব্যবহৃত হয়। এটি ত্রুটি ঘটলে, সেই ত্রুটির কোড (error code
) বা সংখ্যাগত মানকে ধরে রাখে, যা ত্রুটির ধরন সম্পর্কে তথ্য প্রদান করে। যখন একটি ফাংশন সফলভাবে কাজ করতে ব্যর্থ হয়, তখন errno
ভেরিয়েবলে একটি নির্দিষ্ট ত্রুটি কোড সেট করা হয়। প্রোগ্রামাররা এই কোড চেক করে নির্ধারণ করতে পারেন ত্রুটির প্রকৃতি কী এবং সেই অনুযায়ী প্রয়োজনীয় পদক্ষেপ নিতে পারেন।
errno.h
এর প্রয়োজনীয়তা১. ত্রুটি পরিচালনা সহজ করে: errno.h
এর মাধ্যমে ত্রুটি চিহ্নিত ও ব্যাখ্যা করা সহজ হয়। প্রোগ্রামিংয়ে অনেক ফাংশন (যেমন fopen()
, malloc()
, ইত্যাদি) যখন নির্দিষ্ট কারণে সফলভাবে কাজ করতে ব্যর্থ হয়, তখন errno
ব্যবহার করে ত্রুটির কারণ নির্ধারণ করা সম্ভব।
২. ডিবাগিং সহজ করে: ত্রুটির কোড দেখিয়ে errno.h
প্রোগ্রাম ডিবাগ করার ক্ষেত্রে সহায়ক হয়। কোডের কোথায় কোন ত্রুটি ঘটেছে এবং তার কারণ কী, তা দ্রুত নির্ধারণ করা যায়।
৩. উন্নত ব্যবহারকারীর প্রতিক্রিয়া: ত্রুটির ধরন অনুযায়ী ব্যবহারকারীকে উপযুক্ত বার্তা দেখানো যায়। যেমন, ফাইল না পাওয়া গেলে "File not found" বার্তা দেখানো যেতে পারে।
errno
এর সাধারণ ব্যবহৃত ত্রুটি কোডসমূহerrno.h
এ কিছু পূর্বনির্ধারিত ত্রুটি কোড রয়েছে, যা বিভিন্ন ধরনের ত্রুটি নির্দেশ করে। নিচে কিছু সাধারণ ত্রুটি কোডের তালিকা এবং তাদের ব্যাখ্যা দেওয়া হলো:
ত্রুটি কোড | অর্থ | ব্যাখ্যা |
---|---|---|
EACCES | Permission denied | ফাইলে অ্যাক্সেস করার অনুমতি নেই |
ENOENT | No such file or directory | নির্দিষ্ট ফাইল বা ডিরেক্টরি পাওয়া যায়নি |
ENOMEM | Out of memory | পর্যাপ্ত মেমোরি নেই |
EIO | Input/output error | ইনপুট/আউটপুট অপারেশনে ত্রুটি |
EBADF | Bad file descriptor | অবৈধ ফাইল ডেসক্রিপ্টর |
EINVAL | Invalid argument | অবৈধ আর্গুমেন্ট দেওয়া হয়েছে |
ERANGE | Result too large | ফলাফল অত্যন্ত বড় এবং এটি ব্যবহারের সীমা ছাড়িয়ে গেছে |
EPERM | Operation not permitted | অননুমোদিত অপারেশন |
EAGAIN | Resource temporarily unavailable | অস্থায়ীভাবে রিসোর্স পাওয়া যাচ্ছে না |
errno
এর ব্যবহারerrno
হলো একটি গ্লোবাল ইন্টিজার ভেরিয়েবল যা ত্রুটি কোড সংরক্ষণ করে। যখন কোনো ফাংশন ত্রুটি ঘটায়, তখন errno
ত্রুটির ধরন নির্ধারণ করতে সহায়ক হয়। errno
চেক করতে errno.h
হেডার ফাইলটি ইনক্লুড করতে হয় এবং ত্রুটি কোড ব্যাখ্যা করার জন্য strerror()
ফাংশন ব্যবহার করা যেতে পারে।
fopen()
ফাংশনে errno
এর ব্যবহার#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
FILE *file;
// "nonexistent.txt" নামের ফাইলটি খোলার চেষ্টা
file = fopen("nonexistent.txt", "r");
if (file == NULL) {
printf("Error opening file: %s\n", strerror(errno));
return 1;
}
fclose(file);
return 0;
}
এখানে, যদি
"nonexistent.txt"
ফাইলটি বিদ্যমান না থাকে, তবেerrno
তেENOENT
ত্রুটি কোড সেট করা হবে, এবংstrerror()
এর মাধ্যমে ত্রুটির বিবরণ দেখানো হবে: **"No such file or directory"**।
strerror()
ফাংশনstrerror()
ফাংশনটি errno
ত্রুটি কোডকে একটি ব্যাখ্যামূলক স্ট্রিংয়ে রূপান্তর করে। এটি ত্রুটির সংখ্যা অনুযায়ী একটি ব্যাখ্যামূলক বার্তা প্রদান করে, যা ডিবাগিং এবং ত্রুটি সংশোধনে সহায়ক।
সিঙ্কট্যাক্স:
char *strerror(int errnum);
উদাহরণ:
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
errno = EACCES; // অনুমতি সংক্রান্ত ত্রুটি কোড সেট
printf("Error: %s\n", strerror(errno)); // ত্রুটির ব্যাখ্যা প্রদর্শন
return 0;
}
perror()
ফাংশনperror()
ফাংশনটি একটি ব্যাখ্যামূলক ত্রুটি বার্তা প্রদর্শন করে, যেখানে errno
সেট করা ত্রুটি কোডের মানের উপর ভিত্তি করে বার্তা দেখানো হয়।
সিঙ্কট্যাক্স:
void perror(const char *s);
উদাহরণ:
#include <stdio.h>
#include <errno.h>
int main() {
FILE *file = fopen("nonexistent.txt", "r");
if (file == NULL) {
perror("Error opening file"); // ত্রুটি বার্তা প্রদর্শন
return 1;
}
fclose(file);
return 0;
}
এখানে, যদি
"nonexistent.txt"
ফাইলটি বিদ্যমান না থাকে, তবেperror()
ত্রুটি বার্তা দেখাবে: **"Error opening file: No such file or directory"**।
errno.h
হেডার ফাইলটি সি প্রোগ্রামিংয়ে ত্রুটি পরিচালনার জন্য অপরিহার্য। errno
ভেরিয়েবল এবং strerror()
ও perror()
ফাংশন ব্যবহার করে প্রোগ্রামের ত্রুটি সম্পর্কে নির্দিষ্ট তথ্য পাওয়া যায়। এটি প্রোগ্রাম ডিবাগ এবং ব্যবহারকারীর জন্য উন্নত ত্রুটি বার্তা প্রদান করতে সহায়ক।
perror()
এবং strerror()
এর মাধ্যমে এরর মেসেজ জেনারেশনসি প্রোগ্রামিং ভাষায়, perror()
এবং strerror()
ফাংশনগুলো ব্যবহার করে এরর মেসেজ জেনারেট করা যায়। এই ফাংশনগুলো সিস্টেমের ত্রুটি বা সমস্যা সংক্রান্ত বিস্তারিত তথ্য প্রদানে সহায়ক, যেমন ফাইল খোলার সময় ত্রুটি বা মেমোরি বরাদ্দে ত্রুটি ইত্যাদি।
এই ফাংশনগুলোর মধ্যে পার্থক্য হল perror()
ত্রুটির সাথে যুক্ত একটি বর্ণনা মুদ্রণ করে, যেখানে strerror()
নির্দিষ্ট ত্রুটি কোডের জন্য একটি স্ট্রিং রিটার্ন করে।
perror()
– এরর মেসেজের সাথে বর্ণনা মুদ্রণperror()
ফাংশনটি একটি স্ট্রিং ইনপুট নেয় এবং যদি পূর্বে কোনো ত্রুটি ঘটে থাকে (যেমন, সিস্টেম কল ত্রুটি), তবে সেই ত্রুটির বর্ণনা সহ একটি এরর মেসেজ মুদ্রণ করে। এটি স্ট্যান্ডার্ড ত্রুটি আউটপুটে (stderr) ত্রুটির বর্ণনা প্রিন্ট করে।
void perror(const char *str);
str
– একটি স্ট্রিং, যা ত্রুটির আগে মুদ্রণ করা হয়। সাধারণত এটি একটি সংক্ষিপ্ত বর্ণনা বা ফাংশন নাম হতে পারে।#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file = fopen("nonexistent_file.txt", "r");
if (file == NULL) {
perror("Error opening file");
return 1;
}
fclose(file);
return 0;
}
এখানে, fopen()
ফাংশনটি যদি nonexistent_file.txt
ফাইলটি খোলার সময় ত্রুটি ঘটে, তবে perror()
ফাংশনটি ত্রুটির একটি বর্ণনা সহ একটি মেসেজ মুদ্রণ করবে:
Error opening file: No such file or directory
strerror()
– ত্রুটি কোডের বর্ণনা পাওয়াstrerror()
ফাংশনটি একটি ত্রুটি কোড নিয়ে সেই ত্রুটির বর্ণনা হিসেবে একটি স্ট্রিং রিটার্ন করে। এটি সাধারণত errno
ভেরিয়েবলের মান দিয়ে কাজ করে, যা সিস্টেম কল বা লাইব্রেরি ফাংশন থেকে সঠিক ত্রুটি কোড ধারণ করে।
char *strerror(int errnum);
errnum
– ত্রুটি কোড, যা সাধারণত errno
থেকে পাওয়া যায়।#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main() {
FILE *file = fopen("nonexistent_file.txt", "r");
if (file == NULL) {
printf("Error opening file: %s\n", strerror(errno));
return 1;
}
fclose(file);
return 0;
}
এখানে strerror(errno)
ফাংশনটি errno
ভেরিয়েবল থেকে ত্রুটি কোড নিয়ে সেই ত্রুটির বর্ণনা হিসেবে একটি স্ট্রিং রিটার্ন করে। যদি fopen()
ফাংশনটি কোনো ত্রুটি সৃষ্টি করে, তবে আউটপুট হবে:
Error opening file: No such file or directory
perror()
বনাম strerror()
বৈশিষ্ট্য | perror() | strerror() |
---|---|---|
কাজ | ত্রুটির বর্ণনা সহ একটি স্ট্রিং আউটপুট করে | ত্রুটি কোডের জন্য একটি বর্ণনা হিসেবে স্ট্রিং রিটার্ন করে |
ইনপুট | একটি স্ট্রিং যা ত্রুটির বর্ণনা প্রদান করে | ত্রুটি কোড (errno ) |
আউটপুট | স্ট্যান্ডার্ড এরর আউটপুটে মেসেজ মুদ্রণ করে | একটি স্ট্রিং রিটার্ন করে যা ত্রুটির বর্ণনা প্রদান করে |
ব্যবহার | ত্রুটি ঘটে গেলে স্ট্যান্ডার্ড এরর আউটপুটে মেসেজ মুদ্রণ করা | নির্দিষ্ট ত্রুটি কোডের জন্য একটি বর্ণনা রিটার্ন করা |
perror()
: এটি একটি স্ট্রিং গ্রহণ করে এবং স্ট্যান্ডার্ড এরর আউটপুটে ত্রুটির বর্ণনা সহ একটি মেসেজ মুদ্রণ করে। এটি সাধারনত সিস্টেম কলের পর ত্রুটি ঘটলে ব্যবহার করা হয়।strerror()
: এটি একটি ত্রুটি কোড (errno
) নিয়ে ত্রুটির বর্ণনা হিসেবে একটি স্ট্রিং রিটার্ন করে। এটি সাধারণত ত্রুটি কোডগুলি প্রসেস করার সময় ব্যবহার করা হয়।এই দুটি ফাংশনই সি প্রোগ্রামিংয়ে ত্রুটি ম্যানেজমেন্টে সহায়ক, বিশেষত যখন আপনি সিস্টেম কলগুলোর মাধ্যমে ত্রুটি পেতে চান এবং সেই ত্রুটির সঠিক বর্ণনা পেতে চান।
সি প্রোগ্রামিং ভাষায় error code এবং return value চেকিং একটি গুরুত্বপূর্ণ প্র্যাকটিস, যা প্রোগ্রাম চলাকালীন সম্ভাব্য ভুল বা ত্রুটি সনাক্ত করতে সাহায্য করে। বিভিন্ন সি ফাংশন return value অথবা error code রিটার্ন করে, যা ব্যবহারের সময় ত্রুটির অবস্থাকে চিহ্নিত করতে ব্যবহৃত হয়। সঠিক error handling কোডের স্থিতিশীলতা নিশ্চিত করে এবং অপ্রত্যাশিত আচরণ বা ক্র্যাশ এড়ায়।
errno
ভেরিয়েবলটি সিস্টেম কলের ত্রুটি চিহ্নিত করতে ব্যবহৃত হয়।ফাংশন যখন একটি মান রিটার্ন করে, তখন এই রিটার্ন মানটি চেক করা গুরুত্বপূর্ণ, বিশেষত যখন ফাংশনের সফলতা বা ব্যর্থতা নির্ভর করে সেই মানের উপর। উদাহরণস্বরূপ, fopen()
ফাংশনটি ফাইল খুলতে ব্যবহৃত হয় এবং এটি সফল হলে একটি ফাইল পয়েন্টার রিটার্ন করে, কিন্তু যদি ফাইলটি না খোলা যায়, এটি NULL
রিটার্ন করে।
fopen()
এর Return Value চেক করা#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
printf("Error: Unable to open file.\n");
return 1; // ফাইল খোলার ক্ষেত্রে ত্রুটি
}
printf("File opened successfully.\n");
fclose(file); // ফাইল বন্ধ করা
return 0;
}
এখানে fopen()
ফাংশনের রিটার্ন ভ্যালু NULL
চেক করা হয়েছে। যদি NULL
রিটার্ন হয়, তাহলে এটি ফাইল খোলার ত্রুটি নির্দেশ করে এবং প্রোগ্রামটি বন্ধ হয়ে যায়।
অনেক সি ফাংশন error code রিটার্ন করে, বিশেষত সিস্টেম কলের ক্ষেত্রে। উদাহরণস্বরূপ, malloc()
ফাংশনটি যখন মেমোরি বরাদ্দে ব্যর্থ হয়, তখন এটি NULL
রিটার্ন করে। এছাড়াও, errno
ভেরিয়েবলটি সিস্টেম কলের ত্রুটি চিহ্নিত করতে ব্যবহৃত হয়, এবং এর মান বিভিন্ন ত্রুটির কোডের মাধ্যমে ব্যাখ্যা করা যায়।
malloc()
Error Code চেক করা#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(100 * sizeof(int));
if (ptr == NULL) {
printf("Error: Memory allocation failed.\n");
return 1; // মেমোরি বরাদ্দে ত্রুটি
}
printf("Memory allocated successfully.\n");
free(ptr); // মেমোরি মুক্ত করা
return 0;
}
এখানে malloc()
এর রিটার্ন ভ্যালু চেক করা হয়েছে, যদি এটি NULL
রিটার্ন করে, তাহলে "Memory allocation failed" বার্তা প্রদর্শন করা হয়।
errno
এবং এর ব্যবহারের উদাহরণসি প্রোগ্রামে যখন সিস্টেম কল বা স্ট্যান্ডার্ড লাইব্রেরি ফাংশন একটি ত্রুটি ঘটায়, তখন errno
ভেরিয়েবল সেট করা হয়, যা ত্রুটির ধরন নির্দেশ করে। errno
ভেরিয়েবলটি <errno.h>
হেডার ফাইলে ডিফাইন করা থাকে।
errno
চেক করা#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int main() {
FILE *file = fopen("nonexistent_file.txt", "r");
if (file == NULL) {
printf("Error opening file: %s\n", strerror(errno)); // strerror() ব্যবহার করে ত্রুটির বর্ণনা
return 1;
}
fclose(file);
return 0;
}
এখানে, fopen()
যদি ফাইল না খুলতে পারে, তখন errno
সেট হয়ে strerror()
ফাংশনের মাধ্যমে ত্রুটির বর্ণনা প্রদর্শিত হয়।
errno
এর কিছু সাধারণ ত্রুটি কোড:ENOENT
: ফাইল বা ডিরেক্টরি খুঁজে পাওয়া যায়নি।ENOMEM
: মেমোরি বরাদ্দে ব্যর্থতা।EIO
: ইনপুট/আউটপুট ত্রুটি।EINVAL
: অবৈধ আর্গুমেন্ট।প্রায় সব সিস্টেম কল এবং লাইব্রেরি ফাংশন একটি নির্দিষ্ট রিটার্ন ভ্যালু প্রদান করে, যার মাধ্যমে প্রোগ্রামার সঠিকভাবে ত্রুটি চেক করতে পারেন। কিছু ফাংশনের ক্ষেত্রে ত্রুটি ঘটলে -1
বা NULL
রিটার্ন করা হয়, এবং সফল হলে অন্য কোন মান রিটার্ন করা হয়। এই রিটার্ন ভ্যালু চেক করার মাধ্যমে আপনি ত্রুটি পরিচালনা করতে পারবেন।
close()
এর Return Value চেক#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int file_desc = open("example.txt", O_RDONLY);
if (file_desc == -1) {
printf("Error opening file.\n");
return 1; // ফাইল ওপেন করতে ব্যর্থ
}
// ফাইল বন্ধ করার সময় ত্রুটি চেক করা
if (close(file_desc) == -1) {
printf("Error closing file.\n");
return 1; // ফাইল বন্ধ করতে ব্যর্থ
}
printf("File closed successfully.\n");
return 0;
}
এখানে, open()
এবং close()
ফাংশনের রিটার্ন ভ্যালু চেক করা হয়েছে। -1
রিটার্ন হলে এটি ত্রুটি নির্দেশ করে।
fopen()
বা malloc()
এর রিটার্ন ভ্যালু চেক করে, আপনি ত্রুটি হ্যান্ডলিং করতে পারেন।errno
এর মাধ্যমে ত্রুটির ধরন নির্ধারণ করে। strerror()
ফাংশনটি errno
এর মান ব্যাখ্যা করতে ব্যবহৃত হয়।-1
বা NULL
চেকিং: সিস্টেম কল এবং লাইব্রেরি ফাংশনগুলো -1
বা NULL
রিটার্ন করলে এটি ত্রুটি নির্দেশ করে।সি প্রোগ্রামিং ভাষায় Exception Handling বা অসতর্ক অবস্থা হ্যান্ডলিং সরাসরি কোন বিল্ট-ইন ফিচারের মাধ্যমে সরবরাহ করা হয় না, যেমন অন্যান্য ভাষায় (যেমন C++, Java)। তবে, সি প্রোগ্রামিংয়ে এক্সসেপশন হ্যান্ডলিং হ্যান্ডল করার জন্য কিছু কৌশল এবং ট্রিক্স ব্যবহার করা হয়, যা ভুল বা অসতর্ক অবস্থা (runtime error) এ প্রতিক্রিয়া জানাতে সাহায্য করে।
সি ভাষায় সাধারণত error handling করা হয় বিভিন্ন return values, error codes, assertions, এবং setjmp()/longjmp() ফাংশন ব্যবহারের মাধ্যমে।
সি ভাষায় ফাংশনগুলো সাধারণত ইনপুট/আউটপুট, মেমোরি অ্যাক্সেস, ফাইল ওপেন ইত্যাদি অপারেশন সম্পাদনের সময় error codes রিটার্ন করে, যা থেকে প্রোগ্রামার বুঝতে পারেন যে কোনো সমস্যা ঘটেছে।
#include <stdio.h>
int main() {
FILE *file = fopen("nonexistent_file.txt", "r");
// চেক করা যে ফাইল ওপেন সফল হয়েছে কিনা
if (file == NULL) {
printf("Error opening file. Exiting program...\n");
return 1; // Error code রিটার্ন
}
// ফাইল কাজ সম্পন্ন করার পর বন্ধ করা
fclose(file);
return 0;
}
এখানে, fopen()
যদি ফাইল ওপেন করতে ব্যর্থ হয় তবে এটি NULL
রিটার্ন করবে, এবং প্রোগ্রাম একটি error message প্রদর্শন করবে এবং বের হয়ে যাবে।
assert()
ব্যবহার করে Error Checkingassert()
একটি ম্যাক্রো যা একটি শর্ত যাচাই করে এবং সেই শর্তটি যদি সত্য না হয় তবে প্রোগ্রামটি ক্র্যাশ হয়ে যায়। এটি সাধারণত ডিবাগিং এর সময় ব্যবহার করা হয়, কিন্তু runtime error হ্যান্ডলিংয়ের জন্য এটি কিছুটা সহায়ক হতে পারে।
#include <stdio.h>
#include <assert.h>
int divide(int a, int b) {
assert(b != 0); // নিশ্চিত করা যে, b শূন্য নয়
return a / b;
}
int main() {
int result = divide(10, 0); // ভুল ইনপুট দেওয়া হয়েছে
printf("Result: %d\n", result);
return 0;
}
এখানে, assert(b != 0)
নিশ্চিত করবে যে b
শূন্য নয়। যদি b == 0
হয়, তবে প্রোগ্রামটি চলাকালীন একটি ত্রুটি দেখাবে এবং প্রোগ্রামটি বন্ধ হবে।
setjmp()
এবং longjmp()
ব্যবহার করে Error Handlingসি ভাষায় setjmp()
এবং longjmp()
ফাংশন দুটি ব্যবহার করে আপনি একটি ফাংশনের মধ্যে exception handling করতে পারেন। setjmp()
ফাংশন একটি পয়েন্ট (checkpoint) সেট করে, এবং longjmp()
ফাংশনটি সেই পয়েন্টে চলে আসে, এটি কার্যকরভাবে exception-handling এর মতো কাজ করে।
#include <setjmp.h>
jmp_buf env; // Declare a buffer to store the environment
int main() {
int val = setjmp(env); // setjmp sets the environment and returns 0 initially
if (val != 0) {
// If we come here after calling longjmp, then it's an error condition
printf("Error occurred: %d\n", val);
return 1;
} else {
// Normal program flow
// Simulating an error
longjmp(env, 1); // Simulate an error by jumping back to setjmp
}
return 0;
}
ব্যাখ্যা:
setjmp(env)
: এটি চেকপয়েন্ট তৈরি করে এবং 0
রিটার্ন করে।longjmp(env, 1)
: এটি setjmp()
-এ ফিরে যায় এবং 1
রিটার্ন করে, যা একটি ত্রুটি (exception) হিসাবে চিহ্নিত হয়।এটি সি প্রোগ্রামে exception handling এ একটি কাজের মেকানিজম হতে পারে, তবে এটি কিছুটা ঝুঁকিপূর্ণ এবং সঠিকভাবে ব্যবহৃত না হলে প্রোগ্রামের স্টেট ম্যানেজমেন্টে সমস্যা তৈরি করতে পারে।
errno
errno
একটি গ্লোবাল ভেরিয়েবল যা সিস্টেম কল বা লাইব্রেরি ফাংশনগুলির সাথে সম্পর্কিত ত্রুটির কোড ধারণ করে। যখন কোনো সিস্টেম কল বা লাইব্রেরি ফাংশন ত্রুটি ঘটায়, তখন তা errno
সেট করে, এবং প্রোগ্রামার সেই ত্রুটির ধরন চিহ্নিত করতে perror()
বা strerror()
ফাংশন ব্যবহার করতে পারেন।
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
FILE *file = fopen("nonexistent_file.txt", "r");
if (file == NULL) {
// `errno` এবং `perror()` এর মাধ্যমে ত্রুটি প্রদর্শন
perror("Error opening file");
printf("Error number: %d\n", errno);
return 1;
}
fclose(file);
return 0;
}
এখানে perror()
ফাংশনটি errno
ভেরিয়েবলের মানের মাধ্যমে একটি ত্রুটি বার্তা প্রদর্শন করে।
পদ্ধতি | বর্ণনা |
---|---|
return values | ফাংশনের মাধ্যমে error code রিটার্ন করে ত্রুটি শনাক্ত করা। |
assert() | নির্দিষ্ট শর্ত যাচাই করার জন্য ব্যবহৃত, ডিবাগিং এর সময়। |
setjmp()/longjmp() | এক্সেপশন হ্যান্ডলিংয়ের জন্য ব্যবহার করা হয়। |
errno | সিস্টেম কল বা লাইব্রেরি ফাংশন দ্বারা রিটার্ন করা ত্রুটি কোড। |
সি প্রোগ্রামিং ভাষায় Exception Handling সরাসরি সমর্থিত না হলেও, return values
, setjmp()/longjmp()
, errno
এবং assert()
এর মাধ্যমে ত্রুটি শনাক্তকরণ এবং হ্যান্ডলিং করা সম্ভব।
common.read_more